home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / Asuka / source / utils.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2007-10-13  |  4.9 KB  |  193 lines

  1. //    Asuka - VirtualDub Build/Post-Mortem Utility
  2. //    Copyright (C) 2005-2007 Avery Lee
  3. //
  4. //    This program is free software; you can redistribute it and/or modify
  5. //    it under the terms of the GNU General Public License as published by
  6. //    the Free Software Foundation; either version 2 of the License, or
  7. //    (at your option) any later version.
  8. //
  9. //    This program is distributed in the hope that it will be useful,
  10. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. //    GNU General Public License for more details.
  13. //
  14. //    You should have received a copy of the GNU General Public License
  15. //    along with this program; if not, write to the Free Software
  16. //    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. #include "stdafx.h"
  19. #include <vd2/system/vdtypes.h>
  20.  
  21. #include <windows.h>
  22.  
  23. #include <stdio.h>
  24. #include <map>
  25. #include <string>
  26.  
  27. #include "utils.h"
  28. #include "resource.h"
  29.  
  30. using namespace std;
  31.  
  32. typedef map<string, uint32> tVersionMap;
  33. tVersionMap        g_versionMap;
  34. int                g_version;
  35. string        g_machineName;
  36.  
  37.  
  38.  
  39.  
  40. void help() {
  41.     puts("VirtualDub Build/Post-Mortem Utility Version 1.7.1 for "
  42. #if VD_CPU_AMD64
  43.             "AMD64"
  44. #else
  45.             "80x86"
  46. #endif
  47.             );
  48.     puts("Copyright (C) Avery Lee 2005-2007. Licensed under GNU General Public License");
  49.     puts("");
  50.     puts("Usage: Asuka <command> [args...]");
  51.     puts("");
  52.     puts("Asuka fontencode   Extract TrueType font glyph outlines");
  53.     puts("Asuka fxc          Compile shaders for Direct3D");
  54.     puts("Asuka glc          Compile shaders for OpenGL");
  55.     puts("Asuka lookup       Look up address in link map");
  56.     puts("Asuka makearray    Convert binary file to C array");
  57.     puts("Asuka mapconv      Generate runtime symbol database");
  58.     puts("Asuka snapsetup    Temporarily change windows settings for screencaps");
  59.     puts("Asuka verinc       Increment version file");
  60.     exit(5);
  61. }
  62.  
  63. void fail(const char *format, ...) {
  64.     va_list val;
  65.     va_start(val, format);
  66.     fputs("Asuka: Failed: ", stdout);
  67.     vprintf(format, val);
  68.     fputc('\n', stdout);
  69.     va_end(val);
  70.     exit(10);
  71. }
  72.  
  73.  
  74.  
  75. void canonicalize_name(string& name) {
  76.     string::iterator it(name.begin());
  77.  
  78.     *it = toupper(*it);
  79.     ++it;
  80.     transform(it, name.end(), it, name.find('-') != string::npos ? toupper : tolower);
  81. }
  82.  
  83. string get_name() {
  84.     char buf[256];
  85.     DWORD siz = sizeof buf;
  86.  
  87.     if (!GetComputerName(buf, &siz))        // hostname would probably work on a Unix platform
  88.         buf[0] = 0;
  89.  
  90.     string name(buf);
  91.  
  92.     if (name.empty())
  93.         name = "Anonymous";
  94.     else
  95.         canonicalize_name(name);
  96.  
  97.     return name;
  98. }
  99.  
  100. int get_version() {
  101.     return g_version;
  102. }
  103.  
  104. bool read_version() {
  105.     g_machineName = get_name();
  106.     g_versionMap.clear();
  107.     g_version = 0;
  108.  
  109.     FILE *f = fopen("version2.bin","r");
  110.  
  111.     if (!f) {
  112.         printf("    warning: can't open version2.bin for read, starting new version series\n");
  113.         return false;
  114.     }
  115.  
  116.     char linebuf[2048];
  117.  
  118.     while(fgets(linebuf, sizeof linebuf, f)) {
  119.         int local_builds, local_name_start, local_name_end;
  120.         if (1==sscanf(linebuf, "host: \"%n%*[^\"]%n\" builds: %d", &local_name_start, &local_name_end, &local_builds)) {
  121.             string name(linebuf+local_name_start, local_name_end - local_name_start);
  122.  
  123.             canonicalize_name(name);
  124.  
  125.             g_versionMap[name] = local_builds;
  126.  
  127.             g_version += local_builds;
  128.         } else if (linebuf[0] != '\n')
  129.             printf("    warning: line ignored: %s", linebuf);
  130.     }
  131.  
  132.     return true;
  133. }
  134.  
  135. void inc_version() {
  136.     ++g_version;
  137.     ++g_versionMap[g_machineName];
  138. }
  139.  
  140. INT_PTR CALLBACK VerincErrorDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) {
  141.     switch(msg) {
  142.     case WM_COMMAND:
  143.         switch(LOWORD(wParam)) {
  144.         case IDCANCEL:
  145.         case IDC_CHECKOUT:
  146.         case IDC_STRIP_READONLY:
  147.             EndDialog(hdlg, LOWORD(wParam));
  148.             return TRUE;
  149.         }
  150.     }
  151.  
  152.     return FALSE;
  153. }
  154.  
  155. bool write_version() {
  156.     printf("    incrementing to build %d (builds on '%s': %d)\n", g_version, g_machineName.c_str(), g_versionMap[g_machineName]);
  157.  
  158.     for(;;) {
  159.         if (FILE *f = fopen("version2.bin","w")) {
  160.             tVersionMap::const_iterator it(g_versionMap.begin()), itEnd(g_versionMap.end());
  161.  
  162.             for(; it!=itEnd; ++it) {
  163.                 const tVersionMap::value_type val(*it);
  164.                 int pad = 20-val.first.length();
  165.  
  166.                 if (pad < 1)
  167.                     pad = 1;
  168.  
  169.                 fprintf(f, "host: \"%s\"%*cbuilds: %d\n", val.first.c_str(), pad, ' ', val.second);
  170.             }
  171.  
  172.             fclose(f);
  173.             return true;
  174.         } else {
  175.             DWORD attr = GetFileAttributes("version2.bin");
  176.             if (attr != 0xFFFFFFFF && (attr & FILE_ATTRIBUTE_READONLY)) {
  177.                 LRESULT rv = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_VERINC_ERROR), NULL, VerincErrorDlgProc);
  178.  
  179.                 if (rv == IDC_STRIP_READONLY) {
  180.                     SetFileAttributes("version2.bin", attr & ~FILE_ATTRIBUTE_READONLY);
  181.                     continue;
  182.                 } else if (rv == IDC_CHECKOUT) {
  183.                     system("p4 edit version2.bin");
  184.                     continue;
  185.                 }
  186.             }
  187.  
  188.             fail("Can't open version2.bin for write.");
  189.             return false;
  190.         }
  191.     }
  192. }
  193.